package com.abing.core.utils.rsatest.service;

import com.abing.core.utils.rsatest.RSAUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

public class PayController {

    public static Map<String, Object> pay(Map<String, String> request) {
        Map<String, Object> response = new HashMap<>();
        try {
            // 1. 提取请求参数
            String encryptedData = request.get("encryptedData"); // 外部系统加密的业务数据
            String signature = request.get("signature"); // 外部系统对请求的签名
            String timestamp = request.get("timestamp"); // 时间戳（防重放）

            // 2. 验签：使用服务端签名公钥验证请求合法性
            boolean isSignValid = RSAUtils.verify(
                ServerConfig.CLIENT_PUBLIC_KEY,
                timestamp + "|" + encryptedData, // 签名串（需与服务端验签逻辑一致）
                signature
            );
            if (!isSignValid) {
                response.put("code", "4001");
                response.put("msg", "签名验证失败");
                return response;
            }

            // 3. 验时间戳（防重放攻击，允许5分钟偏差）
            long currentTime = System.currentTimeMillis() / 1000;
            long requestTime = Long.parseLong(timestamp);
            if (Math.abs(currentTime - requestTime) > 300) {
                response.put("code", "4002");
                response.put("msg", "请求已过期");
                return response;
            }

            // 4. 解密业务数据（使用服务端私钥）
            String plainData = RSAUtils.decrypt(ServerConfig.SERVER_PRIVATE_KEY, encryptedData);
            System.out.println("服务端解密客户端的请求数据: " + plainData); // 实际处理支付逻辑...

            // 5. 生成响应数据（模拟支付结果）
            Map<String, String> responseData = new HashMap<>();
            responseData.put("orderId", "20240520123456");
            responseData.put("status", "SUCCESS");
            responseData.put("tradeNo", "WX20240520123456789");

            // 6. 加密响应数据（使用外部系统的公钥，假设外部系统已提前注册公钥）
            String externalPublicKey = ServerConfig.CLIENT_PUBLIC_KEY; // 外部系统公钥
            String encryptedResponse = RSAUtils.encrypt(externalPublicKey, responseData.toString());

            // 7. 对响应签名（使用服务端签名私钥）
            String signResponse = RSAUtils.sign(ServerConfig.SERVER_PRIVATE_KEY, encryptedResponse);

            // 8. 返回响应
            response.put("code", "200");
            response.put("msg", "支付成功");
            response.put("encryptedData", encryptedResponse); // 加密的响应数据
            response.put("signature", signResponse); // 响应签名

        } catch (Exception e) {
            e.printStackTrace();
            response.put("code", "500");
            response.put("msg", "服务器内部错误: " + e.getMessage());
        }
        return response;
    }
}